#ifndef IDT_H
#define IDT_H

// idt 中断描述表
// “中断门”就是 CPU 的“安检门”：只允许合法的中断请求进入内核，并自动完成特权级切换、现场保存和中断屏蔽。
// __attribute__((packed)) 不填充

#include <stdint.h>

#define KERNEL_SEGMENT_SELECTOR 0x08
#define IDT_GATE_FLAG 0x8E

typedef struct {
    uint16_t offset_low; // 中断处理器的低16位
    uint16_t segment_selector; // 内核段选择子 即gdt的索引
    uint8_t always0; // 总是0
     /* 标识
     * Bit 7: 1 表示有效
     * Bits 6-5: 特权等级 (0=内核..3=用户)
     * Bit 4: 必须是0
     * Bits 3-0: 1110 表示32位中断门*/
    uint8_t flags;
    uint16_t offset_high; // 中断处理器的高16位
} __attribute__((packed)) idt_gate_t;


typedef struct {
    uint16_t limit;
    uint32_t address;
} __attribute__((packed)) idt_register_t;

#define IDT_ENTRY_NUM 256

void set_idt_gate(int n, uint32_t handler);
void set_idt();

#endif
